package cc.bukkitPlugin.banitem.command;

import java.util.ArrayList;
import java.util.HashSet;

import org.bukkit.command.CommandSender;

import cc.bukkitPlugin.banitem.BanItem;
import cc.bukkitPlugin.banitem.command.analyse.AParam;
import cc.bukkitPlugin.banitem.command.analyse.AnalyseMan;
import cc.bukkitPlugin.util.CCFunction;
import cc.bukkitPlugin.util.plugin.command.TACommandBase;

/**
 * 一个使用参数的命令
 *
 */
public abstract class AParamCommand extends TACommandBase<BanItem>{

    /**所有该命令可用的参数模块*/
    private final HashSet<Class<? extends AParam>> mAllowModel=new HashSet<>();
    /**参数列表,注意使用小写*/
    private final ArrayList<String> mParams=new ArrayList<>();
    /**参数分析器*/
    protected AnalyseMan mAnalyseMan;

    public AParamCommand(CommandExc pExector,String pCmdLabel){
        super(pExector,pCmdLabel);
        this.mAnalyseMan=new AnalyseMan(this.mPlugin);
    }

    /**
     * 为该命令注册一个参数模块
     * @param pClazzParam 参数类
     * @return 是否成功
     */
    protected boolean registerParam(Class<? extends AParam> pClazzParam){
        if(!this.mAllowModel.add(pClazzParam))
            return false;
        AParam tParam=this.mAnalyseMan.getParamModel(pClazzParam);
        if(tParam==null)
            return false;
        for(String sLabel : tParam.getLabels())
            this.mParams.add((sLabel+":").toLowerCase());
        return true;
    }

    /**
     * 在此命令中,此参数模块是否启用
     * @param pClazzParam 参数模块类
     */
    public boolean isParamAllow(Class<? extends AParam> pClazzParam){
        return this.mAllowModel.contains(pClazzParam);
    }

    /**
     * 获取该命令全部可用的带" : "的模块标签列表
     */
    public ArrayList<String> getAllowParam(){
        return (ArrayList<String>)this.mParams.clone();
    }

    /**
     * 默认返回当前命令所有可用的参数标签
     * <p>
     * 如果子命令的第一个位不是参数,请重写该方法
     * </p>
     */
    @Override
    public ArrayList<String> getSubCommand(CommandSender pSender,String pLabel,String[] pArgs){
        if(pArgs==null||pArgs.length==0)
            return this.getAllowParam();
        String lastArg=pArgs[pArgs.length-1];
        if(lastArg.isEmpty())
            return this.getAllowParam();
        int pos=lastArg.indexOf(":");
        if(pos!=-1){
            if(pos!=lastArg.length()-1) //如果" : "不在最后的位置,截去多余的
                lastArg=lastArg.substring(0,pos+1);
            if(CCFunction.containsIgnoreCase(this.getAllowParam(),lastArg)){
                lastArg=lastArg.substring(0,lastArg.length()-1);
                AParam tModel=this.mAnalyseMan.getParamModel(lastArg);
                return tModel.tabComplete(pSender,this,pArgs);
            }
        }
        return new ArrayList<String>(CCFunction.getSamePrefixIgnoreCase(this.getAllowParam(),lastArg,true));
    }

    /**
     * 获取包括子命令自身的参数最大长度
     * <p>默认返回注册的参数模块的数量+1</p>
     */
    @Override
    public int getMaxArgumentLength(String pLabel){
        return this.mAllowModel.size()+1;
    }

}
